//
// Created by 39442 on 2025/10/4.
//

#ifndef THREAD_POOL_THREADPOOL_H
#define THREAD_POOL_THREADPOOL_H

#include <unordered_map>
#include <queue>
#include <iostream>

#include "Task.h"
#include "MyThread.h"

using uLong = unsigned long long;
class Task;

//线程池支持的模式
enum PoolMode {
    MODE_FIXED,	//固定数量的线程
    MODE_CACHED	//线程数量可动态增长
};

class ThreadPool {
public:
    //构造函数
    ThreadPool();
    //析构函数
    ~ThreadPool();

    //设置线程池模式
    void setMode(PoolMode mode);

    //给线程池提交任务		用户调用该接口，传入任务对象
    Result submitTask(std::shared_ptr<Task> sp);

    //设置任务上限阈值
    void setTaskQueMaxThreshHold(int threashhold);

    //设置线程池cached模式下线程阈值
    void setThreadSizeThreshHold(int threashhold);

    //开启线程池,初始值为4
    void start(int initThreadSize = std::thread::hardware_concurrency()-4);

    ThreadPool(const ThreadPool&) = delete;
    ThreadPool& operator=(const ThreadPool&) = delete;
private:
    //定义线程函数		线程池的所有线程从任务队列里消费任务
    void threadFunc(int threadid);

    //检查pool运行状态
    bool checkRunningState() const;
private:
    std::unordered_map<int, std::unique_ptr<MyThread>> threads_;	//线程池中的线程
    //std::vector<std::unique_ptr<Thread>> threads_;	//线程池中的线程

    int initThreadSize_;	//线程池初始大小(fixed)
    int threadSizeThreshHold_;	//线程数量上限
    std::atomic_int curThreadSize_;//记录当前线程总数
    std::atomic_int idleThreadSize_;//记录空线程的数量

    std::queue<std::shared_ptr<Task>> taskQue_; //任务队列
    std::atomic_int taskSize_;	//任务队列中的任务数量
    int taskQueMaxThreshHold_;	//任务队列中的任务数量阈值

    std::mutex taskQueMtx_;	//任务队列的互斥锁,保证任务队列的线程安全
    std::condition_variable notFull_;	//任务队列未满的条件变量
    std::condition_variable notEmpty_;	//任务队列非空的条件变量
    std::condition_variable exitCond_;	//等待线程资源全部回收

    PoolMode poolMode_;	//线程池模式

    std::atomic_bool isPoolRunning_;//表示线程池是否正在执行
};


#endif //THREAD_POOL_THREADPOOL_H